﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;


namespace QuizAppMvc2.Bll
{
    public partial class Parser
    {

        enum token { comentario, filtro, perguntasimples, perguntamultipla, fim, errro, items };

        private token proximo = token.fim;

        private ServiceReference.WebServiceSoapClient client = new ServiceReference.WebServiceSoapClient();

        private string[] lines;

        private string materia, topico, subtopico;

        private int index = -1;

        private int gabarito;

        int p = 0;

        public int GoParser(string[] textos)
        {
            p = 0;
            index = -1;
            lines = textos;

            pegaproximo();
            while (proximo != token.fim)
            {

                switch (proximo)
                {
                    case token.comentario: continua();
                        //   Imprime("comentario");
                        break;
                    case token.filtro: atualizafiltro();
                        //   Imprime("atualizafiltro");
                        break;
                    case token.perguntasimples:
                        //    Imprime("perguntasimples");
                        adicionaperguntasimples();
                        break;
                    case token.perguntamultipla:
                        // Imprime("perguntamultipla");
                        adicionaperguntamultipla();
                        break;
                    default:
                        //     Imprime("desconhecido");
                        break;

                }
                pegaproximo();
            }
            return p;

        }

        private void Imprime(string p)
        {

        }

        private void pegaproximo()
        {
            index++;

            if (index >= lines.Count())
            {
                this.proximo = token.fim;
                return;

            }

            this.proximo = token.errro;

            string currentline = lines[index];

            if (currentline.Length == 0)
                this.proximo = token.comentario;

            else if (currentline.StartsWith("CertoErrado:"))
                this.proximo = token.perguntasimples;

            else if (currentline.StartsWith("Pergunta:"))
                this.proximo = token.perguntamultipla;

            else if (currentline.StartsWith("("))
                this.proximo = token.items;

            else if (currentline.StartsWith("#"))
                this.proximo = token.filtro;



        }

        private void adicionaperguntamultipla()
        {
            string texto;
            Boolean certo = false;
            texto = lines[index].Substring(9).Trim();
            ServiceReference.ArrayOfString ar = new ServiceReference.ArrayOfString();

            pegaproximo();
            int i = 1;
            while (proximo == token.items)
            {

                string alternativa = lines[index].Substring(3).Trim();
                Imprime("****" + alternativa);
                ar.Add(alternativa);
                if (lines[index].StartsWith("(V)")) gabarito = i;
                pegaproximo();
                i++;
            }
            index--;

            Imprime(String.Format("Texto {0} - {1}", texto, gabarito));
            incluidas +=  client.AddNewMultipleQuestion(materia, topico, subtopico, texto, gabarito, ar);
            p++;



        }

        private void adicionaperguntasimples()
        {
            string texto;
            Boolean certo = false;
            texto = lines[index].Substring(12).Trim();
            pegaproximo();
            if (lines[index].StartsWith("(C)")) 
                certo = true;
            Imprime(String.Format("Texto {0} - {1}", texto, certo.ToString()));
            incluidas += client.AddNewSimpleQuestion(materia, topico, subtopico, texto, certo);
            p++;

        }

        private void atualizafiltro()
        {
            string filtro = lines[index].Substring(1).Trim();

            string[] splited = filtro.Split(',');

            if (splited.Count() > 2)
            {
                subtopico = splited[2].Trim();
            }

            if (splited.Count() > 1)
            {
                topico = splited[1].Trim();
            }

            if (splited.Count() > 0)
            {
                materia = splited[0].Trim();
            }


        }

        private void continua()
        {

        }

        public int incluidas { get; set; }
    }
}
